﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading.Tasks;

namespace KnowledgeAssistant
{
    public partial class TeachersForm : Form
    {
        private List<Teacher> teachers = new List<Teacher>();

        public TeachersForm()
        {
            InitializeComponent();
            InitTeachers();
        }

        private void TeachersForm_Load(object sender, EventArgs e)
        {

        }

        private void InitTeachers()
        {
            teachers_dataGridView.AutoGenerateColumns = false;
            this.teachers = TeacherUtil.GetListTeachersWithuserData();
            teachers_dataGridView.DataSource = teachers;
            teachers_dataGridView.Columns[0].DataPropertyName = "FullName";
            teachers_dataGridView.Columns[1].DataPropertyName = "Username";
            teachers_dataGridView.Columns[2].DataPropertyName = "Password";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            EditTeacherForm etf = new EditTeacherForm();
            etf.ShowDialog();
            InitTeachers();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (teachers_dataGridView.SelectedRows.Count > 0)
            {
                Teacher teacher = teachers[teachers_dataGridView.SelectedRows[0].Index];
                EditTeacherForm etf = new EditTeacherForm(teacher);
                etf.ShowDialog();
                InitTeachers();
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (teachers_dataGridView.SelectedRows.Count > 0)
            {
                Boolean found = false;
                DataTable usertable = null;
                int user_id = 0;
                usertable = UserUtil.GetAllUsers(false);
                foreach (DataRow row in usertable.Rows)
                {
                    int owner_id = 0;
                    int owner_type_id = 0;
                    Int32.TryParse(row["owner_id"].ToString(), out owner_id);
                    Int32.TryParse(row["owner_type_id"].ToString(), out owner_type_id);

                    if (owner_id == (int)teachers[teachers_dataGridView.SelectedRows[0].Index].TeacherID &&
                        owner_type_id == 2)
                    {
                        found = true;
                        user_id = (int)row["user_id"];
                    }
                }

                if (found)
                {
                    DialogResult dr = MessageBox.Show("У выбранного препода имеются логин и пароль. Вы настаиваете на полном удалении?", "Удаление преподавателя", MessageBoxButtons.YesNo);
                    if (dr == System.Windows.Forms.DialogResult.Yes)
                    {
                        UserUtil.DeleteUser(user_id);
                        TeacherUtil.DeleteTeacher(teachers[teachers_dataGridView.SelectedRows[0].Index]);
                    }
                }
                else
                {
                    DialogResult dr = MessageBox.Show("Удалить препода из таблицы?", "Удаление преподавателя", MessageBoxButtons.YesNo);
                    if (dr == System.Windows.Forms.DialogResult.Yes)
                    {

                        TeacherUtil.DeleteTeacher(teachers[teachers_dataGridView.SelectedRows[0].Index]);
                    }
                }
                InitTeachers();
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            PrintPreviewForm ppf = new PrintPreviewForm();
            ppf.ShowDialog();
        }

        private void import_students_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Файлы разметки XML|*.xml";
            ofd.ShowDialog();
            if (ofd.FileName != "" && ofd.FileName != null)
            {
                InitXmlTeachersList(ofd.FileName);
                InitTeachers();
            }  
        }

        public static Boolean checkExistTeacherFullName(string lname, string fname, string mname)
        {
            List<Teacher> teachers = TeacherUtil.GetListTeachersWithuserDataForCheckExist();
            if (teachers.Count == 0) return false;
            else
            {
                foreach (Teacher s in teachers)
                {
                    if ((s.LastName == lname) && (s.FirstName == fname) && (s.MiddleName == mname))
                        return true;
                }
            }
            return false;
        }

        private static void InitXmlTeachersList(string fileName)
        {
            #region Описание переменных
            StreamReader sr = new StreamReader(fileName);
            Teacher t = null;
            int count_processed_lines = 0;
            string error_lines = "";
            string notAdded = "";
            string line = "";
            string lname = "";
            string mname = "";
            string fname = "";
            string userName = "";
            string userPass = "";

            int count_saved_teachers = 0;
            int user_exist_number = 0;
            #endregion

            while (!sr.EndOfStream) //Вход в файл, пока не встретится препод
            {
                line = sr.ReadLine(); count_processed_lines++;

                if (line != "" && line.Contains("<teacher>")) //здесь пропускаются все строки без преподов , а также пустые
                {
                    while (!sr.EndOfStream && !line.Contains("<group>") && !line.Contains("</group>"))
                    //пока не встретим группу
                    {
                        Boolean error = false;
                        line = sr.ReadLine(); count_processed_lines++;

                        #region Проход по найденному тегу teacher в поисках lname и дальнейший парсинг
                        if (!error && line != "" && line.Contains("<lname>") && line.Contains("</lname>") && !line.Contains("<teacher>")) //здесь пропускаются все строки с мусором , а также пустые
                        {
                            Boolean teacherReaded = false;
                            Boolean tag_fname = false;
                            Boolean tag_mname = false;

                            lname = StudentsForm.parse_XmlTag(line, "lname").Trim();
                            line = sr.ReadLine(); count_processed_lines++;

                            while (!sr.EndOfStream && (!line.Contains("<fname>") && !line.Contains("</fname>"))
                                 && !line.Contains("<group>") && !line.Contains("<teacher>") && !line.Contains("<mname>"))
                            {
                                line = sr.ReadLine(); count_processed_lines++;
                            }
                            if (line != "" && line.Contains("<fname>") && line.Contains("</fname>")
                                && !line.Contains("<teacher>") && !line.Contains("<group>") && !line.Contains("<mname>"))
                            {
                                fname = StudentsForm.parse_XmlTag(line, "fname").Trim();
                                tag_fname = true;
                                line = sr.ReadLine(); count_processed_lines++;
                            }
                            if (!tag_fname)
                            {
                                MessageBox.Show("Не найдено имя для преподавателя " + lname + " в файле XML! \nНомер строки с ошибкой: " + count_processed_lines);
                                error_lines += count_processed_lines + ", ";
                            }

                            while (tag_fname && !sr.EndOfStream && (!line.Contains("<mname>") && !line.Contains("</mname>"))
                                && !line.Contains("<group>") && !line.Contains("<teacher>"))
                            {
                                line = sr.ReadLine(); count_processed_lines++;
                            }
                            if (tag_fname && line != "" && (line.Contains("<mname>") && line.Contains("</mname>"))
                                && !line.Contains("<teacher>") && !line.Contains("<group>"))
                            {
                                mname = StudentsForm.parse_XmlTag(line, "mname").Trim();
                                userName = StudentsForm.generateRandomString(StudentsForm.ActionType.login);
                                userPass = StudentsForm.generateRandomString(StudentsForm.ActionType.pass);
                                tag_mname = true;
                            }
                            if (!tag_mname && tag_fname)
                            {
                                MessageBox.Show("Не найдено отчество для преподавателя " + lname + " " + fname + " в файле XML! \nНомер строки с ошибкой: " + count_processed_lines);
                                error_lines += count_processed_lines + ", ";
                            }

                            teacherReaded = tag_fname && tag_mname;
                            if (teacherReaded)
                            {
                                if (!checkExistTeacherFullName(lname, fname, mname) && !StudentsForm.checkExistUser(userName))
                                {
                                    t = new Teacher();
                                    t.LastName = lname;
                                    t.FirstName = fname;
                                    t.MiddleName = mname;
                                    TeacherUtil.SaveTeacher(t);

                                    DataTable table = DatabaseConnect.execSP("GetTeacher",
                                        new List<string>() { 0.ToString() }).Tables[0];
                                    int t_id = 0;
                                    foreach (DataRow r in table.Rows)
                                    {
                                        t_id = int.Parse(r["teacher_id"].ToString());
                                    }
                                    UserUtil.AddUser(userName, userPass, 7, t_id, 2);
                                    count_saved_teachers++;
                                }
                                else
                                {
                                    user_exist_number++;
                                    notAdded += "\n" + lname + " " + fname + " " + mname + " с логином " + userName;
                                    line = sr.ReadLine(); count_processed_lines++;
                                }
                            } // закончилось сохранение либо анализ распознанного препода
                        } // если lname не встретился
                        else
                            if (line != "" && (line.Contains("<lname>") || line.Contains("</lname>")) && !line.Contains("<teacher>"))
                            {
                                MessageBox.Show("Найден неопознанный препод в файле XML! \nНомер строки с ошибкой: " + count_processed_lines);
                                error = true;
                            }
                           /* else
                            {
                                if (line != "" && (line.Contains("<mname>") || line.Contains("</mname>")) && !line.Contains("<teacher>")) //здесь пропускаются все строки с мусором , а также пустые
                                {
                                    MessageBox.Show("Найден неопознанный препод в файле XML! \nНомер строки с ошибкой: " + count_processed_lines);
                                    error = true;
                                }
                                else if (line != "" && (line.Contains("<fname>") || line.Contains("</fname>")) && !line.Contains("<teacher>"))
                                {
                                    MessageBox.Show("Найден неопознанный препод в файле XML! \nНомер строки с ошибкой: " + count_processed_lines);
                                    error = true;
                                }
                            }*/
                        #endregion
                    } //закончился цикл поиска фамилии препода (пока не достигнута группа)
                } //закончилось условие входа в тег <teacher>                
            }   //закончился цикл по файлу
            if (count_saved_teachers == 0 && user_exist_number != 0) MessageBox.Show(user_exist_number + " преподов уже присутствуют в списке:\n" + notAdded);
            if (count_saved_teachers != 0 && user_exist_number == 0) MessageBox.Show(count_saved_teachers + " распознанных преподов успешно добавлены");
            if (count_saved_teachers != 0 && user_exist_number != 0) MessageBox.Show(
                user_exist_number + " преподов уже присутствуют в списке:\n" + notAdded + "\n\n" + count_saved_teachers + " распознанных преподов успешно добавлены");
            if (count_saved_teachers == 0 && user_exist_number == 0) MessageBox.Show("Распознанных преподавателей не имеется");
            sr.Close();
        }
    }
}
